package com.hunttown.mes.common.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @title: 微信呢称特殊字符过滤
 * @author: wangjunfu
 * @date: 2020年11月21日 14:22
 * @description:
 */
public class EmojiFilterUtils {
    /**
     * 过滤emoji 或者 其他非文字类型的字符
     *
     * @param source 需要过滤的字符串
     * @return 过滤后的字符串
     */
    public static String filterEmoji(String source) {
        if (!containsEmoji(source)) {
            return source;
        }

        StringBuilder buf = null;
        int len = source.length();
        for (int i = 0; i < len; i++) {
            char codePoint = source.charAt(i);
            if (notisEmojiCharacter(codePoint)) {
                if (buf == null) {
                    buf = new StringBuilder(source.length());
                }
                buf.append(codePoint);
            }
        }

        if (buf == null) {
            return "";
        } else {
            if (buf.length() == len) {
                buf = null;
                return source;
            } else {
                return buf.toString();
            }
        }
    }

    /**
     * 检测是否有emoji字符
     *
     * @param source 需要判断的字符串
     * @return 一旦含有就抛出
     */
    public static boolean containsEmoji(String source) {
        int len = source.length();
        for (int i = 0; i < len; i++) {
            char codePoint = source.charAt(i);
            if (!notisEmojiCharacter(codePoint)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 非emoji表情字符判断
     *
     * @param codePoint
     * @return
     */
    public static boolean notisEmojiCharacter(char codePoint) {
        return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) || (codePoint == 0xD)
                || ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
                || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
    }

    /**
     * 过滤掉不合格的字符
     *
     * @param str 要过滤的字符串
     * @return 合格的
     */
    public static String filterUnqualifiedLetter(String str) {
        StringBuilder newStr = new StringBuilder();

        for (int i = 0; i < str.length(); i++) {
            String s = str.substring(i, i + 1);
            if (isEnglish(s) || isChinese(s)) {
                newStr.append(s);
            }
        }

        return newStr.toString();
    }

    /**
     * 判断是否是英文或数字
     *
     * @param charaString 要判断的字符
     * @return TF
     */
    public static boolean isEnglish(String charaString) {
        if (charaString == null || charaString.equals("")) {
            return false;
        }
        return charaString.matches("^[a-zA-Z0-9]*");
    }

    /**
     * 判断是否是中文
     *
     * @param str 要判断是字符
     * @return TF
     */
    public static boolean isChinese(String str) {
        if (str == null || str.equals("")) {
            return false;
        }

        String regEx = "[\\u4e00-\\u9fa5]+";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.find();
    }

}
